/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.brasilerp.rh;

import br.com.brasilerp.estoque.Estoque;
import br.com.brasilerp.estoque.EstoqueException;
import br.com.brasilerp.fatura.Faturamento;
import br.com.brasilerp.fatura.NotaFiscal;
import br.com.brasilerp.fatura.ReceptorNota;
import br.com.brasilerp.transportadora.Empacotador;
import br.com.brasilerp.transportadora.Pacote;
import br.com.brasilerp.transportadora.Transportadora;
import br.com.brasilerp.transportadora.TransportadoraException;
import br.com.brasilerp.vendas.ItemVenda;
import br.com.brasilerp.vendas.OrdemVenda;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author rgrosz
 */
class EmpacotadorImpl implements Empacotador, ReceptorNota {

    private Transportadora transportadora;
    private Faturamento faturamento;
    private Estoque estoque;
    
    private Pacote pacote;        
    

    void setTransportadora(Transportadora transportadora){
        this.transportadora = transportadora;
    }
    
    void setFaturamento(Faturamento faturamento) {
        this.faturamento = faturamento;        
    }

    void setEstoque(Estoque estoque) {
        this.estoque = estoque;
    }
    
    

    @Override
    public void montarPacote(OrdemVenda venda) throws TransportadoraException {
        this.pacote = new Pacote();

        this.faturamento.setReceptorNota(this);
        this.faturamento.emitirNota(venda);

        try {
            for (ItemVenda item : venda.getProdutos()) {
                estoque.removerProduto(item.getProduto(), item.getQuantidade());
                this.pacote.adicionarItem(item.getProduto());
            }            
        } catch (EstoqueException ex) {
            throw new TransportadoraException("Impossível calcular estoque");            
        }
        this.transportadora.enviarPacote(pacote);
    }

    @Override
    public void receberNota(NotaFiscal nota) {        
        pacote.adicionarItem(nota);
    }
}
